package com.java.basis.lambda;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * @author wangning
 * @create 2021-10-26 14:35
 */
public class LambdaTest01 {

	/**
	 * 1.代表匿名内部类
	 *
	 *
	 */
	@Test
	public void test01() {
		Runnable runnable = new Runnable() {
			@Override
			public void run() {
				System.out.println("Hello");
			}
		};
		runnable.run();
		//等价于
		Runnable runnable1 = () -> System.out.println("Hello");
		runnable1.run();

	}


	@Test
	public void test02() {
		new Thread() {
			@Override
			public void run() {
				System.out.println("传统写法");
			}
		}.start();

		new Thread(() -> System.out.println("lambda写法")).start();
	}

	/**
	 * 2.使用lambda表达式对集合进行迭代
	 */
	@Test
	public void test03() {
		List<String> list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("c");
		list.add("d");
		//传统的遍历方法 before java 8
		for (String s : list) {
			System.out.println(s);
		}
		//使用 lambda 后 after java 8
		list.forEach(s -> System.out.println(s));
		list.forEach(System.out::println);

	}

	/**
	 * 3.使用 lambda 表达式实现map
	 */
	@Test
	public void test04() {
		List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
		cost.stream().map(x -> x + x*0.05).forEach(x -> System.out.println(x));
		System.out.println("-------------------");
		cost.stream().map(x -> x + x*0.05).forEach(System.out::println);
	}

	/**
	 * 4.用 lambda 表达式实现 map 与 reduce
	 * map的作用是将一个对象变为另外一个，而reduce实现的则是将所有值合并为一个
	 */
	@Test
	public void test05() {
		List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
		double allCost = cost.stream().map(x -> x+x*0.05).reduce((sum,x) -> sum + x).get();
		double allCost1 = cost.stream().map(x -> x+x*0.05).reduce(Double::sum).get();
		System.out.println(allCost);

	}

	/**
	 * 如果我们使用for循环就需要以下操作
	 */
	@Test
	public void sumTest() {
		List<Double> cost = Arrays.asList(10.0, 20.0,30.0);
		double sum = 0;
		for(double each:cost) {
			each += each * 0.05;
			sum += each;
		}
		System.out.println(sum);
	}


	/**
	 * 5.filter也是我们经常使用的一个操作。在操作集合的时候，经常需要从原始的集合中过滤掉一部分元素
	 */
	@Test
	public void filterTest() {
		List<Double> cost = Arrays.asList(10.0, 20.0,30.0,40.0);
		List<Double> filteredCost = cost.stream().filter(x -> x > 25.0).collect(Collectors.toList());
		filteredCost.forEach(x -> System.out.println(x));
		filteredCost.forEach(System.out::println);

	}


}
